#pragma once
#include "process_sharefile.h"

namespace share
{
    /*
    * @Brief
    *   订阅回调函数
    * @Parameters
    * [input] dataType: 数据类型，参考AlgDataType_T
    * [output] dataBuf: 订阅数据缓冲区指针
    * [output] datalen: 订阅数据长度
    * [input] userData: 回调函数用户数据
    * @Return
    * 空
    * */
    typedef void (*ShareCallbackFun)(unsigned char *pDataBuf, unsigned int dwDatalen, void *pUserData);

    /*
    * @Brief
    *   初始化接口，初始化日志打印
    * @Parameters
    *  无
    * @Return
    * 成功返回0， 失败返回-1
    * */
    int MEMFD_Init();
    /*
    * @Brief
    *   订阅主题数据接口, 数据类型根据dataType来做区分.
    * 该函数内部会创建线程，当数据可用时执行回调函数。 该函数只需要调用一次。
    * 如果数据生产者还未初始化，该接口会阻塞，直到对方初始化完成。
    * @Parameters
    * [input] pTopic: 主题名字
    * [input] callBack: 回调函数
    * [input] 用户数据
    * @Return
    *   成功返回0, 失败返回-1
    * */
    int MEMFD_Subscriber(const char *pTopic, ShareCallbackFun callBack, void *pUserData);

    /*
    * @Brief
    *   发布主题数据, 该函数可以重复调用
    * @Parameters
    * [input] pTopic: 主题名字
    * [input] dataType: 根据枚举定义区分数据类型
    * [input] data: 数据缓冲区
    * [input] len: 数据长度
    * @Return
    *   成功返回0, 失败返回-1
    * */
    int MEMFD_Publisher(const char *pTopic, unsigned char *pData, unsigned int dwLen);

    /*
    * @Brief
    *   分段发布主题数据, 该函数可以重复调用，通常pData 里面存放数据头，pData2里面存放数据，减少内存拷贝
    * @Parameters
    * [input] pTopic: 主题名字
    * [input] dataType: 根据枚举定义区分数据类型
    * [input] pData: 数据缓冲区
    * [input] dwLen: 数据长度
    * [input] pData2: 数据缓冲区
    * [input] dwLen2: 数据长度
    * @Return
    *   成功返回0, 失败返回-1
    * */
    int MEMFD_Publisher2(const char *pTopic, unsigned char *pData, unsigned int dwLen, unsigned char *pData2, unsigned int dwLen2);

    /*
    * @Brief
    *   该函数只允许发布方调用！！！ 高级参数设定函数，支持设置共享内存大小，预留单笔数据大小。
    * @Parameters
    * [input] pTopic: 主题名字
    * [input] dwMaxBufSize: 预分配共享内存大小
    * [input] dwSinglePackSize: 共享内存后面预留的单笔数据大小。
    * @Return
    *   成功返回0, 失败返回-1
    * */
    int MEMFD_Adv_Parameter_Set(const char *pTopic, unsigned int dwMaxBufSize, unsigned int dwSinglePackSize);

    /*
    * @Brief 
    *   释放资源
    * @Prarameters
    * 无
    * @Return
    *   成功返回0, 失败返回-1
    * */
    int MEMFD_Release();
}